using B.S.Data.MES.API.Applications.AccountApplication.Command;
using B.S.Domain.Accounts;
using B.S.Infratrctrue;
using B.S.Requst;
using MediatR;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace B.S.Data.MES.API.Applications.AccountApplication.CommandHandler
{
    /// <summary>
    /// 角色列表命令处理器
    /// </summary>
    public class GetRoleListCommandHandler : IRequestHandler<GetRoleListCommand, APIRequst<List<RoleEntty>>>
    {
        /// <summary>
        /// 角色仓储
        /// </summary>
        private readonly IBaseRepository<RoleEntty> _roleRepository;

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="roleRepository">注入角色仓储</param>
        public GetRoleListCommandHandler(IBaseRepository<RoleEntty> roleRepository)
        {
            _roleRepository = roleRepository;
        }

        /// <summary>
        /// 处理获取角色列表的命令
        /// </summary>
        /// <param name="request">请求参数（无）</param>
        /// <param name="cancellationToken">取消令牌</param>
        /// <returns>角色列表响应</returns>
        public async Task<APIRequst<List<RoleEntty>>> Handle(GetRoleListCommand request, CancellationToken cancellationToken)
        {
            try
            {
                // 查询所有未被删除的角色
                // BaseModel中的isDel属性用于逻辑删除，这里过滤掉已删除的角色
                var roles = _roleRepository.GetAll()
                    .Where(r => !r.isDel)  // 排除已删除的角色
                    .ToList();

                // 返回成功响应
                return new APIRequst<List<RoleEntty>>
                {
                    Code = RequstCode.成功,  // 设置状态码为成功
                    Msg = "获取角色列表成功",  // 设置成功消息
                    Data = roles  // 返回查询到的角色列表数据
                };
            }
            catch (Exception ex)
            {
                // 捕获异常并返回失败响应
                return new APIRequst<List<RoleEntty>>
                {
                    Code = RequstCode.失败,  // 设置状态码为失败
                    Msg = $"获取角色列表失败：{ex.Message}",  // 设置失败消息并包含异常信息
                    Data = new List<RoleEntty>()  // 返回空列表
                };
            }
        }
    }
}